package note_002;

import java.io.FileOutputStream;

/**
 * UnsupportedEncodingException:不支持 编码异常.
 * ClassNotFoundException:找不到类异常
 * 如果读取的字节不是通过对象输出流序列化对象的一组字节时会抛出异常.
 * InvalidClassException：无效  执行后，类名改变，则出异常.
 */
public class day04 {
    public static void main(String[] args) {
        /** IO : JAVA标准的输入与输出 */
//        文件流是实际链接程序与文件的"管道"，用于读写文件的流。
        /** java定义了两个超类:java.io.InputStream和OutputStream */
//        InputStream(字节输入流):是所有字节输入流的超类，规定了读取字节的相关操作。所有实际读取字节的
//                流都继承自它
//        OutputStream(字节输出流):是所有字节输出流的超类，用于写出字节。
//        输入与输出的参照方向是我们的程序:
//        输入:从外界到程序的方向，是用来读取数据的
//        输出:从程序到外界的方向，是用来写出数据的
        /*FileOutputStream fos = new FileOutputStream("./fos.dat");*/
        /*()里可以写入字符串""或file:它可以表示一个文件并可以自己创建文件夹*/
        /** write() 写入 */
//        void write(int d)
//        向文件中写入1个字节，写入的是给定的int值对应得2进制的"低八位"
//                                   vvvvvvvv
//        00000000 00000000 00000000 00000001
        /** close():结束 */
        /** int read() 读取 */
//        读取1个字节，读取到的8位2进制存入一个int值的“低8位”上，高24位全部补0
//        如果读取到了文件末尾，则返回的int值为-1。
        /** 文件复制 */
//        int d =0;//用来记录每次读取到的字节
//        long start = System.currentTimeMillis();
//        while ( (d=fis.read()) != -1 ){
////            System.out.println(toBinaryString(d));
//            fos.write(d);
//        }
//        long end = System.currentTimeMillis();
//        System.out.println("复制完毕!耗时:"+(end-start)+"毫秒");
        /** 块读 */
        /** int read(byte[] data) 块读操作 */
        /*  一次性读取给定的字节数组总长度的字节量并存入到该数组中。返回值为实际读取到的字节量。
            如果返回值为-1则表示本次没有读取到任何字符并且这里已经是流的末尾了。
         */
        /** void write(byte[] data) */
        /* 一次性将给定的字节数组中所有字节写出 */

//        byte[] data = new byte[1024*10];
//        int len;//每次实际读取到的字节数量
//        while( (len = fis.read(data)) !=-1 ){
//            fos.write(data);
//        }
        /** 追加模式(true) */
        /*   文件输出流的追加模式:
        //当重新书写，写入OutputStream操作时，原本那个复制的文件则被清除，进行重新书写!
        FileOutputStream fos = new FileOutputStream("foa.txt",  true  );
            文件输出流默认----的构造方法----创建时-----如果指定的文件----存在-----,会将该文件数据---------抹除.

            文件流也支持追加模式,就是在实例化时再传入一个boolean型参数,如果这个值为true则
            是追加模式.即:指定的文件若存在,该文件数据全部保留,当前文件流会从文件末尾开始接着写新的数据.
         */
        /** int read(byte[] data) 块读操作 */
        //一次性读取给定的字节数组总长度的字节量并存入到该数组中。返回值为实际读取到的字节量。
        //如果返回值为-1则表示本次没有读取到任何字符并且这里已经是流的末尾了。
        /** void write(byte[] data) */
        //一次性将给定的字节数组中所有字节写出
        /** void write(byte[] data ,int off ,int len ) */
        //一次性将给定的字节数组从下标offset处开始的连续len个字节写出
        //-------------------------------------------------------------/* 使用文件流向文件中写入文本数据(字符串). */
        /** byte[] getBytes(String csn) 将字符串转换为一组字节 */
        /*  cns:charset name 字符集名字
            支持汉字的字符集有:
            GBK : 国标编码，英文1字节，中文每个字2字节.
            UTF-8 : unicode的变长编码，又称:万国码 其中英文1字节，中文3字节.
        */
        /** 缓冲流: *///------------------------------------------缓冲流:
        /** BufferedInputStream和BufferedOutputStream. */
        //  含有缓冲区(进行块读),默认8k,满才走
        /** 缓冲输出流写出数据时的缓冲区问题: */
        /** flush():待写出数据一次性写出 */
        /* 将缓冲输出流中已经缓存的待写出数据一次性写出 */
        /** close():含flush() */
        /* 缓冲输出流在关闭时会自动调用一次flush()方法 */
        /** 对象流: *///-------------------------------------------对象流:
        /** objectInputStream | objectOutputStream
         *          对象序列化 与 反序列化
         *   按照其结构转换为一组字节的过程。
         *   要求该对象所属的类必须实现可序列化接口:java.io.Serializable
         */
        /** writeObject() 对象序列化 */
        /*
            对象输出流在进行对象序列化时要求该对象所属的类必须实现可序列化接口,
            否则会抛出异常：NotSerializableException. -> 读写的对象类没有序列化
            序列化接口:java.io.Serializable.
         */
        /** 使用对象输入流进行对象序列化. */
        /** Object readObject() 反序列化 */
        /*
            Object readObject()
            对象输入流提供的反序列化方法，将读取的字节还原为java对象

            如果读取的字节不是通过对象输出流序列化对象的一组字节时会抛出异常.
            ClassNotFoundException
         */
        /** 被transient关键词修饰的属性序列化时会被忽略. */








    }
}
